package com.example.demo.model;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;

@Data // Lombok 注解，自动生成 getter/setter、toString、equals 和 hashCode 方法
@NoArgsConstructor // Lombok 注解，生成无参构造函数
@AllArgsConstructor // Lombok 注解，生成全参构造函数
@JsonInclude(Include.NON_NULL) // Jackson 注解，确保 JSON 序列化时不包含 null 值
public class ApiResponse<T> {

    private boolean success; // 请求是否成功
    private String message;  // 提供给用户的可选消息
    private T data;          // 返回给前端的数据体
    private int statusCode;  // HTTP状态码

    @JsonInclude(Include.NON_NULL)
    private Error error;     // 如果请求失败，错误信息

    // 内部静态类：错误信息
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public static class Error {
        private String code; // 错误代码
        private String description; // 错误描述
    }

    // 用于成功的静态工厂方法
    public static <T> ApiResponse<T> success(T data, String message) {
        return new ApiResponse<>(true, message, data, 200, null);
    }

    // 用于成功的静态工厂方法（无数据）
    public static <T> ApiResponse<T> success(String message) {
        return success(null, message);
    }

    // 用于成功的静态工厂方法（无消息）
    public static <T> ApiResponse<T> success(T data) {
        return success(data, null);
    }

    // 用于失败的静态工厂方法
    public static <T> ApiResponse<T> failure(int statusCode, String errorCode, String errorMessage) {
        return new ApiResponse<>(false, null, null, statusCode, new Error(errorCode, errorMessage));
    }
}